package com.chezai.client.dao.manager;

import android.text.TextUtils;

import com.chezai.client.bean.TerminalParameter;
import com.chezai.client.dao.DaoManager;
import com.chezai.client.dao.TerminalParameterDao;
import com.chezai.client.global.Config;
import com.chezai.client.global.Const;
import com.chezai.client.global.NetConst;
import com.jx.driving.request.domain.Parameter;
import com.jx.driving.response.Terminal0x8701Response;

import java.util.ArrayList;
import java.util.List;

/**
 * 终端参数数据操作管理类
 * Created by likunyang on 2017/8/25.
 */

public class TerminalParameterDaoManager {
    private static TerminalParameterDaoManager newInstance;
    private TerminalParameterDao terminalParameterDao;
    private List<TerminalParameter> terminalParameters;
    private String mParamType;

    private TerminalParameterDaoManager() {
        terminalParameterDao = DaoManager.getInstance().getDaoSession().getTerminalParameterDao();
        if (terminalParameterDao.loadAll().size() <= 0) {
            initTermianlParameter();
        }
    }

    public static TerminalParameterDaoManager getInstance() {
        if (newInstance == null) {
            newInstance = new TerminalParameterDaoManager();
        }
        return newInstance;
    }

    public TerminalParameterDao getTerminalParameterDao() {
        return terminalParameterDao;
    }

    /**
     * 初始化终端参数，app参数
     */
    public void initTermianlParameter() {
        String servicePort = NetConst.SERVER_TCP_PORT;
        String serviceIP = NetConst.SERVER_TCP_ADDRESS;
        terminalParameterDao.insertInTx(
                //终端参数
                new TerminalParameter(1, "10", "1", "客户端心跳发送间隔，单位为秒(s)"),
                new TerminalParameter(2, "60", "1", "TCP消息应答超时时间，单位为秒(s)"),
                new TerminalParameter(3, "15", "1", "TCP消息重传次数"),
                new TerminalParameter(4, "60", "1", "UDP消息应答超时时间，单位为秒(s)"),
                new TerminalParameter(5, "15", "1", "UDP消息重传次数"),
                new TerminalParameter(6, "60", "1", "SMS消息应答超时时间，单位为秒(s)"),
                new TerminalParameter(7, "15", "1", "SMS消息重传次数"),
                new TerminalParameter(16, "10.0.0.1", "1", "主服务器APN，无线通信拨号访问点。若网络制式为CDMA，则该处为 PPP拨号号码"),
                new TerminalParameter(17, "admin", "1", "主服务器无线通信拨号用户名"),
                new TerminalParameter(18, "admin", "1", "主服务器无线通信拨号密码"),
                new TerminalParameter(19, serviceIP, "1", "主服务器地址，IP或域名"),
                new TerminalParameter(20, "10.0.0.2", "1", "备份服务器 APN，无线通信拨号访问点"),
                new TerminalParameter(21, "_admin", "1", "备份服务器无线通信拨号用户名"),
                new TerminalParameter(22, "_admin", "1", "备份服务器无线通信拨号密码"),
                new TerminalParameter(23, "60.205.170.12", "1", "备份服务器地址，IP 或域名"),
                new TerminalParameter(24, servicePort, "1", "服务器 TCP 端口"),
                new TerminalParameter(25, "6060", "1", "服务器 UDP 端口"),
                new TerminalParameter(32, "0", "1", "位置汇报策略，0：定时汇报；1：定距汇报；2：定时和定距汇报"),
                new TerminalParameter(33, "0", "1", "位置汇报方案，0：根据 ACC 状态；1：根据登录状态和 ACC 状态，先判断登录状态，若登录再根据 ACC 状态"),
                new TerminalParameter(34, "60", "1", "驾驶员未登录汇报时间间隔，单位为秒(s),>0"),
                new TerminalParameter(39, "300", "1", "休眠时汇报时间间隔，单位为秒(s),>0"),
                new TerminalParameter(40, "30", "1", "紧急报警时汇报时间间隔，单位为秒(s),>0"),
                new TerminalParameter(41, "60", "1", "缺省时间汇报间隔，单位为秒(s),>0"),
                new TerminalParameter(44, "10", "1", "缺省距离汇报间隔，单位为米(m),>0"),
                new TerminalParameter(45, "10", "1", "驾驶员未登录汇报距离间隔，单位为米(m),>0"),
                new TerminalParameter(46, "10", "1", "休眠时汇报距离间隔，单位为米(m),>0"),
                new TerminalParameter(47, "10", "1", "紧急报警时汇报距离间隔，单位为米(m),>0"),
                new TerminalParameter(48, "45", "1", "拐点补传角度，<180°"),
                new TerminalParameter(64, "400-110-6666", "1", "监控平台电话号码°"),
                new TerminalParameter(65, "400-110-8888", "1", "复位电话号码，可采用此电话号码拨打终端电话让终端复位"),
                new TerminalParameter(66, "400-110-9999", "1", "恢复出厂设置电话号码，可采用此电话号码拨打终端电话让终端恢复"),
                new TerminalParameter(67, "400-100-6600", "1", "监控平台 SMS 电话号码"),
                new TerminalParameter(68, "400-100-7070", "1", "接收终端 SMS 文本报警号码"),
                new TerminalParameter(69, "0", "1", "终端电话接听策略，0：自动接听；1：ACC ON 时自动接听，OFF 时手动接听"),
                new TerminalParameter(70, "0", "1", "每次最长通话时间，单位为秒(s),0 为不允许通话，0xFFFFFFFF 为不限制"),
                new TerminalParameter(71, "0", "1", "当月最长通话时间，单位为秒(s),0 为不允许通话，0xFFFFFFFF 为不限制"),
                new TerminalParameter(72, "400-600-1234", "1", "监听电话号码"),
                new TerminalParameter(73, "400-600-1234", "1", "监管平台特权短信号码"),
                new TerminalParameter(80, "1", "1", "报警屏蔽字。与位置信息汇报消息中的报警标识相对应，相应位为 1则相应报警被屏蔽"),
                new TerminalParameter(81, "1", "1", "报警发送文本 SMS 开关，与位置信息汇报消息中的报警标识相对应，相应位为 1 则相应报警时发送文本 SMS"),
                new TerminalParameter(82, "1", "1", "报警拍摄开关，与位置信息汇报消息中的报警标识相对应，相应位为1 则相应报警时摄像头拍摄"),
                new TerminalParameter(83, "1", "1", "报警拍摄存储标识，与位置信息汇报消息中的报警标识相对应，相应位为 1 则对相应报警时牌的照片进行存储，否则实时长传"),
                new TerminalParameter(84, "1", "1", "关键标识，与位置信息汇报消息中的报警标识相对应，相应位为 1 则对相应报警为关键报警"),
                new TerminalParameter(85, "120", "1", "最高速度，单位为公里每小时(km/h)"),
                new TerminalParameter(86, "60", "1", "超速持续时间，单位为秒(s)"),
                new TerminalParameter(87, "14400", "1", "连续驾驶时间门限，单位为秒(s)"),
                new TerminalParameter(88, "36000", "1", "当天累计驾驶时间门限，单位为秒(s)"),
                new TerminalParameter(89, "0", "1", "最小休息时间，单位为秒(s)"),
                new TerminalParameter(90, "3600", "1", "最长停车时间，单位为秒(s)"),
                new TerminalParameter(112, "1", "1", "图像/视频质量，1-10,1 最好"),
                new TerminalParameter(113, "255", "1", "亮度，0-255"),
                new TerminalParameter(114, "64", "1", "对比度，0-127"),
                new TerminalParameter(115, "64", "1", "饱和度，0-127"),
                new TerminalParameter(116, "128", "1", "色度，0-255"),
                new TerminalParameter(128, "1", "1", "车辆里程表读数，1/10km"),
                new TerminalParameter(129, "01", "1", "车辆所在的省域 ID"),
                new TerminalParameter(130, "01", "1", "车辆所在的市域 ID"),
                new TerminalParameter(131, "110110", "1", "公安交通管理部门颁发的机动车号牌"),
                new TerminalParameter(132, "0", "1", "车牌颜色，按照 JT/T415-2006 的 5.4.12"),
                new TerminalParameter(133, "50", "1", "车辆脉冲系数，车辆行驶1km距离过程中产生的脉冲信号个数"),
                //app参数
                new TerminalParameter(Const.TermianlParameter.TAKE_PHOTO_INTERVAL_ID, "15", "2", "定时拍照时间间隔min"),
                new TerminalParameter(1048578, "1", "2", "照片上传设置"),
                new TerminalParameter(1048579, "2", "2", "是否报读附加消息"),
                new TerminalParameter(1048580, "10", "2", "熄火后停止学时计时的延时时间min"),
                new TerminalParameter(1048581, "3600", "2", "熄火后 GNSS 数据包上传间隔s"),
                new TerminalParameter(1048582, "150", "2", "熄火后教练自动登出的延时时间min"),
                new TerminalParameter(1048583, "30", "2", "重新验证身份时间min"),
                new TerminalParameter(1048584, "1", "2", "教练跨校教学"),
                new TerminalParameter(1048585, "2", "2", "学员跨校学习"));
    }

    /**
     * 根据类型查找所有终端配置参数
     *
     * @param type TerminalParameter.APP_PARAM and TerminalParameter.TERMINAL_PARAM
     * @return
     */
    public List<TerminalParameter> findTerminalParameterByType(String type) {
        if (TextUtils.equals(mParamType, type) && terminalParameters != null) {
            return terminalParameters;
        }
        this.mParamType = type;
        terminalParameters = terminalParameterDao.queryBuilder().where(TerminalParameterDao.Properties.Type.eq(type)).list();
        if (terminalParameters != null) {
            return terminalParameters;
        }
        return null;
    }

    public com.jx.driving.domain.TerminalParameter findTerminalParameter(String type) {
        List<TerminalParameter> parameters = findTerminalParameterByType(type);
        com.jx.driving.domain.TerminalParameter obj = new com.jx.driving.domain.TerminalParameter();
        if (parameters != null) {
            for (com.chezai.client.bean.TerminalParameter parameter : parameters) {
                long keyId = parameter.getId();
                String value = parameter.getValue();
                if (keyId == Const.TermianlParameter.TAKE_PHOTO_INTERVAL_ID) {
                    obj.setTakePhotoInterval(Short.parseShort(value));
                } else if (keyId == 1048578) {
                    obj.setImageUplaodSetting(Short.parseShort(value));
                } else if (keyId == 1048579) {
                    obj.setAttachementable(Short.parseShort(value));
                } else if (keyId == 1048580) {
                    obj.setFlameoutStopTimingDelay(Short.parseShort(value));
                } else if (keyId == 1048581) {
                    obj.setFlameoutGnssUplaodInterval(Integer.parseInt(value));
                } else if (keyId == 1048582) {
                    obj.setFlameoutCoachLoginoutInterval(Integer.parseInt(value));
                } else if (keyId == 1048583) {
                    obj.setResign(Integer.parseInt(value));
                } else if (keyId == 1048584) {
                    obj.setCoachCross(Short.parseShort(value));
                } else {
                    obj.setUserCross(Short.parseShort(value));
                }
            }
            obj.setNo((short) 0);
        } else {
            obj.setNo((short) 1);
        }
        return obj;
    }


    /**
     * 通过TerminalParameter Id 查找终端参数
     *
     * @param id 此ID为初始化终端参数中的Id相对应，主要依据为ParameterIdDefinition中定义的Id
     * @return
     */
    public TerminalParameter findTerminalParameterByKeyId(long id) {
        TerminalParameter terminalParameter = terminalParameterDao.queryBuilder().where(TerminalParameterDao.Properties.Id.eq(id)).unique();
        if (terminalParameter != null) {
            return terminalParameter;
        }
        return null;
    }

    /**
     * 更新终端参数 配置
     *
     * @param id    参数配置Id see findTerminalParameterByKeyId
     * @param value 参数值
     */
    public void updateTerminalParameterById(long id, String value) {
        TerminalParameter parameter = findTerminalParameterByKeyId(id);
        parameter.setValue(value);
        terminalParameterDao.update(parameter);
    }

    public float getTerminalParameter128() {
        TerminalParameter parameter = findTerminalParameterByKeyId(128);
        float mile = 0;
        if (parameter != null && !TextUtils.isEmpty(parameter.getValue())) {
            mile = Float.valueOf(parameter.getValue());
        }
        return mile;
    }

    /**
     * 通过8701响应，更新终端参数
     *
     * @param ox8701
     */
    public void updateTerminalParameterWith0x8701(Terminal0x8701Response ox8701) {
        ArrayList<Parameter> parameters = new ArrayList<>(4);
        ArrayList<TerminalParameter> terminalParameters = new ArrayList<>(4);
        Parameter province = new Parameter(129, ox8701.getProvinceId());
        Parameter city = new Parameter(130, ox8701.getCityId());
        Parameter identification = new Parameter(131, ox8701.getIdentification());
        Parameter carColor = new Parameter(132, (short) ox8701.getSignColor());
        parameters.add(province);
        parameters.add(city);
        parameters.add(identification);
        parameters.add(carColor);
        for (Parameter parameter : parameters) {
            TerminalParameter terminalParameter = findTerminalParameterByKeyId(parameter.getId());
            if (terminalParameter == null) {
                terminalParameter = new TerminalParameter();
                terminalParameter.setId(parameter.getId());
                terminalParameter.setType(TerminalParameter.APP_PARAM);
            }
            terminalParameter.setValue(String.valueOf(parameter.getObject()));
            terminalParameters.add(terminalParameter);
        }
        terminalParameterDao.updateInTx(terminalParameters);
    }

    /**
     * 通过8501响应，更新终端参数
     *
     * @param parameter
     */
    public void updateTerminalParameterWith0x8501(com.jx.driving.domain.TerminalParameter parameter) {
        for (int i = 0; i < 9; i++) {
            switch (i) {
                case 0:
                    updateTerminalParameterById(Const.TermianlParameter.TAKE_PHOTO_INTERVAL_ID, String.valueOf(parameter.getTakePhotoInterval()));
                    break;
                case 1:
                    updateTerminalParameterById(1048578, String.valueOf(parameter.getImageUplaodSetting()));
                    break;
                case 2:
                    updateTerminalParameterById(1048579, String.valueOf(parameter.getAttachementable()));
                    break;
                case 3:
                    updateTerminalParameterById(1048580, String.valueOf(parameter.getFlameoutStopTimingDelay()));
                    break;
                case 4:
                    updateTerminalParameterById(1048581, String.valueOf(parameter.getFlameoutGnssUplaodInterval()));
                    break;
                case 5:
                    updateTerminalParameterById(1048582, String.valueOf(parameter.getFlameoutCoachLoginoutInterval()));
                    break;
                case 6:
                    updateTerminalParameterById(1048583, String.valueOf(parameter.getResign()));
                    break;
                case 7:
                    updateTerminalParameterById(1048584, String.valueOf(parameter.getCoachCross()));
                    break;
                case 8:
                    updateTerminalParameterById(1048585, String.valueOf(parameter.getUserCross()));
                    break;
            }
        }
    }
}
